package com.jdy.haoduoaiteacher.widget;

import android.annotation.SuppressLint;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.support.annotation.NonNull;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.CalendarView;
import android.widget.DatePicker;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.NumberPicker;
import android.widget.TextView;

import com.jdy.haoduoaiteacher.util.CommonUtil;
import com.jdy.haoduoaiteacher.util.Tools;
import com.ycsj.goldmedalnewconcept.R;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

/**
 * 
 * 互动任务提醒
 * 
 * @author hf
 * 
 */
public class CustomTimeDialogDate extends Dialog {

  public CustomTimeDialogDate(Context context, int theme) {
    super(context, theme);
  }

  public CustomTimeDialogDate(Context context) {
    super(context);
  }

  public static class Builder {

    private Context context;
    private String title;
    private String strDate;
    private String strHourMinute;
    private String positiveButtonText;
    private String negativeButtonText;
    private View contentView;

    private OnClickListener negativeButtonClickListener;

    public interface OnOkClickListener {
      void onClickOk(String strDate);
    }

//    public interface OnWeekChangeListener {
//      void onWeekChanged(String strWeek);
//    }

    public interface OnToggleListener {
      void onToggleClicked(int hour, int minute, boolean bOpen);
    }

    private OnToggleListener mOnToggleListener;

    public OnToggleListener getmOnToggleListener() {
      return mOnToggleListener;
    }

    public void setmOnToggleListener(OnToggleListener mOnToggleListener) {
      this.mOnToggleListener = mOnToggleListener;
    }

    private OnOkClickListener positiveButtonClickListener;
//    private OnWeekChangeListener mOnWeekChangeListener;



    public Builder(Context context) {
      this.context = context;
    }

    /**
     * Set the Dialog message from String
     *
     * @return
     */
    public Builder setMessage(String message) {
      // this.message = message;
      return this;
    }

    /**
     * Set the Dialog message from resource
     *
     * @return
     */
    public Builder setMessage(int message) {
      // this.message = (String) context.getText(message);
      return this;
    }

    /**
     * Set the Dialog title from resource
     *
     * @param title
     * @return
     */
    public Builder setTitle(int title) {
      this.title = (String) context.getText(title);
      return this;
    }

    /**
     * Set the Dialog title from String
     *
     * @param title
     * @return
     */
    public Builder setTitle(String title) {
      this.title = title;
      return this;
    }

    public Builder setDateStr(String str) {
      this.strDate = str;
      return this;
    }

    public Builder setHourMinuteStr(String str) {
      this.strHourMinute = str;
      return this;
    }



    /**
     * Set a custom content view for the Dialog. If a message is set, the
     * contentView is not added to the Dialog...
     *
     * @param v
     * @return
     */
    public Builder setContentView(View v) {
      this.contentView = v;
      return this;
    }

    /**
     * Set the positive button resource and it's listener
     *
     * @param positiveButtonText
     * @param listener
     * @return
     */
    public Builder setPositiveButton(int positiveButtonText,
        OnOkClickListener listener) {
      this.positiveButtonText = (String) context.getText(positiveButtonText);
      this.positiveButtonClickListener = listener;
      return this;
    }

    /**
     * Set the positive button text and it's listener
     *
     * @param positiveButtonText
     * @param listener
     * @return
     */
    public Builder setPositiveButton(String positiveButtonText,
        OnOkClickListener listener) {
      this.positiveButtonText = positiveButtonText;
      this.positiveButtonClickListener = listener;
      return this;
    }

//    public Builder setWeekChangedListener(OnWeekChangeListener listener) {
//      this.mOnWeekChangeListener = listener;
//      return this;
//    }

    /**
     * Set the negative button resource and it's listener
     *
     * @param negativeButtonText
     * @param listener
     * @return
     */
    public Builder setNegativeButton(int negativeButtonText,
        OnClickListener listener) {
      this.negativeButtonText = (String) context.getText(negativeButtonText);
      this.negativeButtonClickListener = listener;
      return this;
    }

    /**
     * Set the negative button text and it's listener
     *
     * @param negativeButtonText
     * @param listener
     * @return
     */
    public Builder setNegativeButton(String negativeButtonText,
        OnClickListener listener) {
      this.negativeButtonText = negativeButtonText;
      this.negativeButtonClickListener = listener;
      return this;
    }

//    private TimePicker timePicker;
    private DatePicker datePicker;

    private TextView tv_weekday;

    /**
     * 调整FrameLayout大小
     *
     * @param tp
     */
    private void resizePikcer(FrameLayout tp) {
      List<NumberPicker> npList = findNumberPicker(tp);
      for (NumberPicker np : npList) {
        resizeNumberPicker(np);
      }
    }

    /*
* 调整numberpicker大小
*/
    private void resizeNumberPicker(NumberPicker np) {
      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(Tools.getPixelByDip(context, 60),
              LinearLayout.LayoutParams.WRAP_CONTENT);
      params.setMargins(10,10, 10, 10);
      np.setLayoutParams(params);
    }

    /**
     * 得到viewGroup里面的numberpicker组件
     *
     * @param viewGroup
     * @return
     */
    private List<NumberPicker> findNumberPicker(ViewGroup viewGroup) {
      List<NumberPicker> npList = new ArrayList<NumberPicker>();
      View child = null;
      if (null != viewGroup) {
        for (int i = 0; i < viewGroup.getChildCount(); i++) {
          child = viewGroup.getChildAt(i);
          if (child instanceof NumberPicker) {
            npList.add((NumberPicker) child);
          } else if (child instanceof LinearLayout) {
            List<NumberPicker> result = findNumberPicker((ViewGroup) child);
            if (result.size() > 0) {
              return result;
            }
          }
        }
      }
      return npList;
    }

    private CustomTimeDialogDate dateDlg;

    // boolean bChecked;

    /**
     * Create the custom dialog
     */
    @SuppressLint("InflateParams")
    @SuppressWarnings("deprecation")
    public CustomTimeDialogDate create() {
      LayoutInflater inflater = (LayoutInflater) context
          .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

      final CustomTimeDialogDate dialog = new CustomTimeDialogDate(context,
          R.style.custom_dialog);
      dialog.setCanceledOnTouchOutside(false);
      final Context contextThemeWrapper = new ContextThemeWrapper(context,
          R.style.cust_dialog);
      LayoutInflater localInflater = inflater
          .cloneInContext(contextThemeWrapper);

      View layout = localInflater.inflate(R.layout.time_dialog, null);

     // timePicker = (TimePicker) layout.findViewById(R.id.time_picker);
      tv_weekday = (TextView) layout.findViewById(R.id.tv_weekday);
      datePicker = (DatePicker) layout.findViewById(R.id.date_picker);
      this.datePicker.init(this.datePicker.getYear(), this.datePicker.getMonth(), this.datePicker.getDayOfMonth(), new DatePicker.OnDateChangedListener() {
        @Override
        public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
          String textDate = year + "-" + String.format("%02d", monthOfYear + 1) + "-"
                  + String.format("%02d", dayOfMonth);

          if (tv_weekday != null) {
            tv_weekday.setText(Tools.getWeek(textDate));
//            if (mOnWeekChangeListener!=null) {
//              mOnWeekChangeListener.onWeekChanged(Tools.getWeek(textDate));
//            }
          }
        }
      });

      String textDate = datePicker.getYear() + "-" + String.format("%02d", datePicker.getMonth() + 1) + "-"
              + String.format("%02d", datePicker.getDayOfMonth());
      if (tv_weekday != null) {
        tv_weekday.setText(Tools.getWeek(textDate));
      }

      datePicker.getCalendarView().setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
        @Override
        public void onSelectedDayChange(@NonNull CalendarView view, int year, int month, int dayOfMonth) {
          String textDate = year + "-" + String.format("%02d", month + 1) + "-"
                  + String.format("%02d", dayOfMonth);
          if (tv_weekday != null) {
            tv_weekday.setText(Tools.getWeek(textDate));
          }
        }
      });
     resizePikcer(datePicker);

      Calendar calendar = Calendar.getInstance();
      calendar.setTimeInMillis(System.currentTimeMillis());


//     int minute = calendar.get(Calendar.MINUTE);

      //timePicker.setIs24HourView(true);

//      if (Tools.isNotEmpty(strHourMinute)) {
//        String [] strarr = strHourMinute.split(":");
//        if (strarr != null) {
//          timePicker.setCurrentHour(Integer.parseInt(strarr[0]));
//          timePicker.setCurrentMinute(Integer.parseInt(strarr[1]));
//        } else {
//          timePicker.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY));
//          timePicker.setCurrentMinute(calendar.get(Calendar.MINUTE));
//        }
//      } else {
//        timePicker.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY));
//        timePicker.setCurrentMinute(calendar.get(Calendar.MINUTE));
//      }

      dialog.addContentView(layout, new LayoutParams(LayoutParams.FILL_PARENT,
          LayoutParams.WRAP_CONTENT));
      ((TextView) layout.findViewById(R.id.title)).setText(title);

// 2017-02-01
      if (Tools.isNotEmpty(strDate)) {
        this.datePicker.init( Integer.parseInt(strDate.substring(0,4)), Integer.parseInt(strDate.substring(5,7))-1, Integer.parseInt(strDate.substring(8,10)),null);
      } else {
        this.datePicker.init(this.datePicker.getYear(), this.datePicker.getMonth(), this.datePicker.getDayOfMonth(),null);
      }

      // set the confirm button
      if (positiveButtonText != null) {
        ((Button) layout.findViewById(R.id.positiveButton))
            .setText(positiveButtonText);
        ((Button) layout.findViewById(R.id.positiveButton))
            .setOnTouchListener(CommonUtil.VIEW_TOUCH_DARK);
        if (positiveButtonClickListener != null) {
          ((Button) layout.findViewById(R.id.positiveButton))
              .setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {


                 int  arrive_year = datePicker.getYear();
                 int  arrive_month = datePicker.getMonth();
                  int arrive_day = datePicker.getDayOfMonth();


                  String textDate = arrive_year + "-" + String.format("%02d", arrive_month + 1) + "-"
                          + String.format("%02d", arrive_day);

                  positiveButtonClickListener.onClickOk(textDate);
                }
              });
        }
      } else {
        // if no confirm button just set the visibility to GONE
        layout.findViewById(R.id.positiveButton).setVisibility(View.GONE);
      }

      // set the cancel button
      if (negativeButtonText != null) {
        ((Button) layout.findViewById(R.id.negativeButton))
            .setText(negativeButtonText);
        ((Button) layout.findViewById(R.id.negativeButton))
            .setOnTouchListener(CommonUtil.VIEW_TOUCH_DARK);

        if (negativeButtonClickListener != null) {
          ((Button) layout.findViewById(R.id.negativeButton))
              .setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                  negativeButtonClickListener.onClick(dialog,
                      DialogInterface.BUTTON_NEGATIVE);
                }
              });
        }
      } else {
        // if no confirm button just set the visibility to GONE
        layout.findViewById(R.id.negativeButton).setVisibility(View.GONE);
      }
      // set the content message
      // if (message != null) {
      // ((TextView) layout.findViewById(R.id.message)).setText(message);
      // } else

      if (contentView != null) {
        // if no message set
        // add the contentView to the dialog body
        ((LinearLayout) layout.findViewById(R.id.content)).removeAllViews();
        ((LinearLayout) layout.findViewById(R.id.content)).addView(contentView,
            new LayoutParams(LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT));
      } else if (contentView == null) {
        // // if no message and contentView is also null then show
        // // edit box!
        // // layout.findViewById(R.id.message).setVisibility(View.GONE);
        // tpp = (TimePicker) layout.findViewById(R.id.input);
      }
      dialog.setContentView(layout);
      Tools.adjustDialogSize(dialog);
      return dialog;
    }
  }

}